Pinvon's Blog

所见, 所闻, 所思, 所想

用户数据报协议 UDP

进程间通信

IP 协议负责把数据报从源主机交付到目的主机. 这是一种不完整的交付, 因为报文没有被送到正确的进程. TCP/UDP 这些传输层协议负责进程到进程的通信.

端口号

在 C/S 架构中, 客户端进程使用端口号标识自己, 这种端口号称为 短暂端口号.

服务端进程也要用端口号标识自己, 但服务端的端口号不能随便选取, 因为随便选取的话, 客户端进程就不知道是哪个端口了. 服务端选取的端口号, 称为 熟知端口号.

UDP 的熟知端口号如下表所示:

端口 协议 描述
7 Echo 把收到的数据报发回给发送端
9 Discard 丢弃收到的任何数据报
11 Users 活跃的用户
13 Daytime 返回时间
17 Quote 返回时间
19 Chargen 返回字符串
53 Nameserver 域名服务
67 Bootps 下载引导程序信息的服务器端口
68 Bootpc 下载引导程序信息的客户端端口
69 TFTP 简单文件传送协议
111 RPC 远程过程调用
123 NTP 网络时间协议
161 SNMP 简单网络管理协议
520 RIP 路由信息协议

套接字地址(Socket)

Socket = IP + Port. 它唯一标识了某一主机上的某一进程.

面向连接服务和面向无连接服务

面向连接服务(虚电路)

在进行数据交换前, 先建立连接, 当数据传输结束后, 释放这个连接. 具体包括以下三个阶段:

  • 建立连接: 给出完整的源和目的地址.
  • 数据交换: 该阶段每个报文不必包含完整的源和目的地址, 只需使用一个连接标识符来代替, 提高效率.
  • 释放连接

由于面向连接服务中, 报文有序发送和接收.

面向无连接服务

每个数据报都要给出完整的源和目的地址, 开销较大.

面向无连接服务主要有三种类型:

  • 数据报: 发完报文就结束, 对方不做任何响应, 可靠性较差.
  • 证实交付: 对每一个报文产生一个证实给发送方, 但这种证实只能保证报文已经发送到目的站了, 不能保证对方正确接收.
  • 请求回答: 接收端用户每收到一个报文, 就向发送端发送一个应答报文.

UDP 协议

UDP 协议是无连接的, 不可靠的. 在发送数据前, 不建立连接.

UDP 不提供确认, 也不对数据的到达顺序加以控制, 因此, UDP 报文可能会丢失.

报文格式

10.png

有效负载长度 = IP总长度 - IP首部长度

校验和包括伪首部, UDP首部 和 UDP数据, 该字段可选, 如果为 0, 表示不进行校验. 伪首部是 IP首部 的一部分. 如果不包括伪首部, 用户数据报也可能是安全的, 但是, 如果 IP首部 受到损伤, 则它可能被交付到错误的主机.

UDP 应用

TCP 协议是基于连接的可靠协议, 有流量控制和差错控制, 传输效率较低.

UDP 协议是基于无连接的不可靠协议, 没有控制手段, 仅仅是将数据发送给对方, 效率较高.

所以, UDP 适用于对效率要求较高, 对准确性要求较低的场景.

如:

  • 即时通信(如 QQ聊天): 对准确性和丢包要求较低, 但速度必须快.
  • 在线视频: 保证视频连续, 偶尔一个图像不清晰, 是可以接受的.
  • 网络语音通话: 保证通话连续, 偶尔断音或串音, 是可以接受的.

Comments

使用 Disqus 评论
comments powered by Disqus